//
//  CZUserAccountViewModel.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/19.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit
import SVProgressHUD
class CZUserAccountViewModel: NSObject {
    //创建单利
    
//    static let sharedViewModel: CZUserAccountViewModel = CZUserAccountViewModel()
    
//    static let sharedViewModel: CZUserAccountViewModel = {
//       
//        
//        let b = CZUserAccountViewModel()
//        
//        b.account = b.accountInSanBox()
//        
//        return b
//    }()
    
    static let sharedViewModel: CZUserAccountViewModel = CZUserAccountViewModel()
    
    override init() {
        
        super.init()
        
        
        //代表当前初始化的时候,就尝试去沙盒中去读取数据
        
        account = self.accountInSanBox()
        
        
//        print(isLogin)
        
//        
//     print(account)
//        
//        print(account?.expireTime)
        
    }
    
    //当前登录的用户账户信息
    
    var account: CZUserAccountModel?
    
    
    //这个是只读accesstoken
    var accessToken: String? {
        
        return self.account?.access_token
    }
    
    
    //当前用户是否登录
    
    var isLogin: Bool {
        
        if accessToken == nil {
            
            return false
            
        }
        
//        print(NSDate())
        
//        print(self.account?.expireTime)
//        
//        print(self.account?.expireTime)
//        
        //直接判断是否过期
//        if accessToken 
        
        guard let expiresDate = self.account?.expireTime else{
          
            
            //没有过期时间,直接返回
            
            return false
        }
        
        //进行比较
        
        //这个代表升序,说明实际时间小于预计时间
        
       
        
        if NSDate().compare(expiresDate) == .OrderedAscending {
            
            
            return true
        }
        
        
        return false
        
        
        
        
        
        
        
        
        
        
        
        
    }
    
    
    
    
    
    
    //加载accessToken
    
    //定义一个finishedBlock 用来判断其是否完成,如果错误,显示的是游客界面
//    finish: (isSuccess: Bool)->()
    func loadAccessToken(code: String,finish: (isSuccess: Bool)->()){
        
        //https://api.weibo.com/oauth2/access_token
        
        
        
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        //需要传递的参数
        
        /*
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        
        
        */
        
        
        //定义参数
        
        //        let params = ["client_id":"3650639813",
        //        "client_secret":"bb3afe6caa27b1d6ed240c0ab921bc5b",
        //        "grant_type":"authorization_code",
        //            "code":"3e2b491beaa8e2d4ee1cfad9dd6d4492",
        //        "redirect_uri":"http://www.baidu.com/"]
        
        let params = ["client_id":WB_APP_KEY,
            "client_secret":WB_APP_SER,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":WB_APP_URL]
        
        
      
      
        
        
        CZNewWorkTools.sharedTools.request(.Post, urlString: urlString, paramenters: params) { (responseObject, error) -> () in
            
            
            //发送请求,并使用SVProgress进行判断
            
            if error != nil {
                
                SVProgressHUD.showErrorWithStatus("网络错误")
                
//                print(error)
                
                //读取错误,调用block
                finish(isSuccess: false)
                
                
                return
                
                
                
                
                
                
            }
            
            
            //如果有数据,进行转模型
            
            //判断返回的数据是否是字典,如果不对,则返回数据格式不正确
            
            guard let dict = responseObject as? [String: AnyObject] else{
                
                
                print("后台数据错误")
                
                finish(isSuccess: false)
                
                
                return
                
            }
            
            //这里就是字典了,可以进行装模型了
            
            //这里进行字典转模型
            
            let account = CZUserAccountModel(dict: dict)
            
            
//            print(account)
            
            //accessToken 获取到个人信息
            
            self.loadUserInfo(account,finish: finish)
            
            
            
            
            
            
            
            
            
            
            
            
        }
        
        
        
        
        
        
        
        
        
        
        
        
    }
    
    //获取到了model,进行设置
    private func loadUserInfo(account: CZUserAccountModel,finish: (isSuccess: Bool)->()){
        
        //获取个人信息
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        
        //传入参数,然后进行读取
        
        /*
        
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        domain	true	string	需要查询的个性化域名。
        
        
        */
        
        
        //可选的尤其要注意,注意,做出来的数据,有可能带有optional
        let params = ["access_token": account.access_token ?? "",
            "uid": account.uid ?? ""]
        
        
        
        //发送请求
        
        
        CZNewWorkTools.sharedTools.request(urlString: urlString, paramenters: params) { (responseObject, error) -> () in
            
            
            
            
            //判断数据是否请求正确
            
            if error != nil {
                
                
                print("网络错误");
                
//                print("---------\(error)")
                
                finish(isSuccess: false)
                
                
                
                return
                
            }
            
            
            guard let dict = responseObject as? [String: AnyObject] else{
                
                
                print("后台数据错误")
                
                finish(isSuccess: false)
                
                return
                
            }
            
            //注意如果 = 前面的值是可选值,那么就使用as? 如果后面的值是必选值,就使用as!
            
            
            
            
            
            //根据请求,获取存储对应的数据,注意字典的类型是anyObject,所以我们需要装换成String类型和
            
            account.name = dict["name"] as? String
            
            account.avatar_large = dict["avatar_large"] as? String
            
            
            
//            print(account)
            
            //获取到了个人信息之后应该立即保存到沙盒路径下
            
            
            //这里一定要注意,就是self.account = account
            
            self.account = account
            
            //这个实在闭包里面,使用self
            
            self.saveAccount(account)
            
            
            finish(isSuccess: true)
            
            
            
            
        }
        
        
        
        
        
        
        
        
        
        
    }
    
    
    //将数据保存到沙盒中去
    private func saveAccount(account: CZUserAccountModel){
        
        
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
        
        print(path)
        
        
        //将内容存放在对应文件下
        
        NSKeyedArchiver.archiveRootObject(account, toFile: path)
        
        
        
        
        
        
        
        
        
        
        
        
    }
    
    //从沙盒中读取用户的信息
    //读取出来的可能有值,也可能没值,所以可选
    private func accountInSanBox() -> CZUserAccountModel? {
        
        
//        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
//        
//        print(path)
//        
//        let result =  NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccountModel
//        
//        print(result)
//        
//        
//        
//        return result
        
        
        
        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("account.archive")
        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccountModel
        return result
        
        
        
        
        
        
        
    }
    
    

    
    
    
    
    

}
